#include <iostream>
#include <sstream>
#include <random>
#include <string>
#include <atomic>
#include <iomanip>
static std::string GetUUID()
{
    std::random_device dv; // 直接生成一个机器随机数
    // int num = dv();
    std::mt19937_64 gernator(dv()); // 通过梅森旋转算法，生成一个伪随机数
    // 控制范围为0-255
    std::uniform_int_distribution<int> distribution(0, 255);
    // 转化为16进制保存并按照8-4-4格式--->c5cbb153-e132-d884-
    std::stringstream ss;
    for (int i = 0; i < 8; i++)
    {
        ss << std::setw(2) << std::setfill('0') << std::hex << distribution(gernator);
        if (i == 3 || i == 5 || i == 7)
            ss << "-";
    }
    // 生成八位序号拼接在后边
    static std::atomic<size_t> sep(1); // 从1开始
    size_t tem = sep.fetch_add(1);     // 每次+1
    for (int i = 7; i >= 0; i--)
    {
        ss << std::setw(2) << std::setfill('0') << std::hex << ((tem >> (i * 8)) & 0xff);
        if (i == 6)
            ss << "-";
    }
    return ss.str();
}
// 生成uuid，uuid的格式为由8个范围为0-255的16进制数加上8字节的序号按照8-4-4-4-12的位数格式显示
int main()
{
    for(int i = 0;i<10;i++)
    {
        std::cout<<GetUUID()<<std::endl;
    }
    // std::random_device dv; // 直接生成一个机器随机数
    // // int num = dv();
    // std::mt19937_64 gernator(dv()); // 通过梅森旋转算法，生成一个伪随机数
    // // 控制范围为0-255
    // std::uniform_int_distribution<int> distribution(0, 255);
    // // 转化为16进制保存并按照8-4-4格式--->c5cbb153-e132-d884-
    // std::stringstream ss;
    // for (int i = 0; i < 8; i++)
    // {
    //     ss << std::setw(2) << std::setfill('0') << std::hex << distribution(gernator);
    //     if (i == 3 || i == 5 || i == 7)
    //         ss << "-";
    // }
    // // 生成八位序号拼接在后边
    // static std::atomic<size_t> sep(1); // 从1开始
    // size_t tem = sep.fetch_add(1);     // 每次+1
    // for (int i = 7; i >= 0; i--)
    // {
    //     ss << std::setw(2) << std::setfill('0') << std::hex << ((tem >> (i * 8)) & 0xff);
    //     if (i == 6)
    //         ss << "-";
    // }
    // std::cout << ss.str() << std::endl;

    // int num = distribution(gernator);
    // std::cout<<num<<std::endl;
    return 0;
}